class LxStringUtil {
  // 末尾补 字符 到指定长度
  static String padRight(int length, String str, String pad) {
    String originalString = str;
    return originalString.padRight(length, pad);
  }

  // 前面补 字符 到指定长度
  static String padLeft(int length, String str, String pad) {
    String originalString = str;
    return originalString.padLeft(length, pad);
  }

  /// 将字符串的第一个英文字母大写（其他字母不变）
  static String capitalizeFirstLetter(String input) {
    if (input.isEmpty) return input; // 空字符串直接返回
    return input[0].toUpperCase() + input.substring(1);
  }

  // 隐藏邮箱部分字符
  static String obscureEmail(String email,
      {int visibleStart = 2, int visibleEnd = 0}) {
    if (email.isEmpty) return '';

    final parts = email.split('@');
    if (parts.length != 2) return email;

    final username = parts[0];
    final domain = parts[1];

    if (username.length <= visibleStart + visibleEnd) {
      return '${'*' * username.length}@$domain';
    }

    final start = username.substring(0, visibleStart);
    final end =
        visibleEnd > 0 ? username.substring(username.length - visibleEnd) : '';
    final middle = '*' * (username.length - visibleStart - visibleEnd);

    return '$start$middle$end@$domain';
  }

  // 隐藏手机号部分字符
  static String obscurePhone(
    String phone, {
    int visiblePrefix = 3,
    int visibleSuffix = 2,
    bool keepFormatting = true,
  }) {
    if (phone.isEmpty) return '';

    // 分离国际区号和本地号码
    final PhoneParts parts = parsePhoneNumber(phone);

    if (parts.localNumber.isEmpty) return phone;

    final localDigits = parts.localNumber.replaceAll(RegExp(r'[^\d]'), '');

    if (localDigits.length <= visiblePrefix + visibleSuffix) {
      final obscuredLocal = '*' * localDigits.length;
      return '${parts.countryCode}$obscuredLocal';
    }

    final prefix = localDigits.substring(0, visiblePrefix);
    final suffix = visibleSuffix > 0
        ? localDigits.substring(localDigits.length - visibleSuffix)
        : '';
    final middle = '*' * (localDigits.length - visiblePrefix - visibleSuffix);

    final obscuredLocal = keepFormatting
        ? formatPhoneNumber(prefix + middle + suffix, parts.localNumber)
        : prefix + middle + suffix;

    return '${parts.countryCode}$obscuredLocal';
  }

  // 格式化国家码，去掉"+"号，前面加上"0"，补充为4位数
  static String formatAreaCode(String phoneCode) {
    String code = phoneCode.replaceAll('+', '');
    code = padLeft(4, code, '0');
    return code;
  }

  // 前面去掉"0"，添加"+"号
  static String reverseAreaCode(String formattedCode) {
    if (formattedCode.isEmpty) return '';
    // 去除所有前导0
    String code = formattedCode.replaceAll(RegExp(r'^0+'), '');
    // 如果去除0后为空，返回原始值或默认值
    if (code.isEmpty) {
      code = formattedCode;
    }
    // 添加加号前缀
    return '+$code';
  }

  // 解析电话号码，分离国家码和本地号码
  static PhoneParts parsePhoneNumber(String phone) {
    // 处理国际格式 (+86 138-0013-8000)
    if (phone.startsWith('+')) {
      final match = RegExp(r'^(\+\d{1,4})(.*)$').firstMatch(phone);
      if (match != null) {
        return PhoneParts(
          countryCode: match.group(1)!,
          localNumber: match.group(2)!.trim(),
        );
      }
    }

    // 处理其他国际格式 (0086 13800138000)
    if (phone.startsWith('00')) {
      final match = RegExp(r'^(00\d{1,4})(.*)$').firstMatch(phone);
      if (match != null) {
        return PhoneParts(
          countryCode: '+${match.group(1)!.substring(2)}', // 0086 -> +86
          localNumber: match.group(2)!.trim(),
        );
      }
    }

    // 默认作为本地号码处理
    return PhoneParts(countryCode: '', localNumber: phone);
  }

  // 格式化本地号码，保持原有格式
  static String formatPhoneNumber(String digits, String original) {
    // 简单的格式化保持逻辑
    if (original.contains('-')) {
      // 尝试保持原格式，如 138-****-**00
      if (digits.length >= 11) {
        return '${digits.substring(0, 3)}-${digits.substring(3, 7)}-${digits.substring(7)}';
      }
    } else if (original.contains(' ')) {
      if (digits.length >= 11) {
        return '${digits.substring(0, 3)} ${digits.substring(3, 7)} ${digits.substring(7)}';
      }
    }

    return digits;
  }
}

// 存储电话号码的国家码和本地号码部分
class PhoneParts {
  final String countryCode;
  final String localNumber;

  PhoneParts({required this.countryCode, required this.localNumber});
}
